package com.amin.concurrent;

import java.util.concurrent.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//ReentrantLock 重入锁
//重入锁的性能高，原因是默认用的是非公平锁策略。
//ReentrantLock(false)=》非公平锁（默认）
//ReentrantLock(true)=》公平锁
//强调：使用重入锁，必须注意锁的释放问题，要在finally来释放，避免出现异常造成死锁(看源码		   ArrayBlockingQueue)
//补充：同步代码块的锁释放由JVM来实现的
//总结：非公平锁的策略是允许插队，能够表现出很高的吞吐量，从性能角度考虑，建议使用

public class TestReentrantLockDemo1 {
	public static String name = "李雷";
	public static String gender = "男";

	public static void main(String[] args) {

		/**
		 * ReentrantLock重入锁 性能高，默认使用的是非公平锁的策略。 需要人为解锁，否则可能会出现死锁。 同步代码锁释放由jvm处理。
		 * 公平锁：排队机制，性能低
		 */
		Lock lock = new ReentrantLock();// 默认非公平锁 true：公平锁；false：非公平锁
		new Thread(new SynRun3(lock)).start();
		new Thread(new SynRun4(lock)).start();
	}

}

class SynRun3 implements Runnable {
	private Lock lock;

	public SynRun3(Lock lock) {
		super();
		this.lock = lock;
	}

	public void run() {
		while (true) {
			lock.lock();
			if ("李雷".equals(TestReentrantLockDemo1.name)) {
				TestReentrantLockDemo1.name = "韩梅梅";
				TestReentrantLockDemo1.gender = "女";
			} else {
				TestReentrantLockDemo1.name = "李雷";
				TestReentrantLockDemo1.gender = "男";
			}
			lock.unlock();
		}
	}
}

class SynRun4 implements Runnable {
	private Lock lock;

	public SynRun4(Lock lock) {
		super();
		this.lock = lock;
	}

	public void run() {
		while (true) {
			lock.lock();// 开始锁定
			System.out.println(TestReentrantLockDemo1.name + "," + TestReentrantLockDemo1.gender);
			lock.unlock();// 释放锁
		}
	}
}
